Dein GIIIs, die 4 unbekannten WesenA: Hardware-Erweiterung für 1 MB RAM Helmut Bernhardt, Arnulf SoppDie 128 Refreshzyklen des Z80 lassen sich auf 256 Zyklen erweitern, was die Verwendung von 41256-RAMs ermöglicht (Abb. 3). Dadurch kann jeder Z80-Computer auf mindestens das vierfache Speichervolumen aufgebohrt werden, indem man die vorhandenen 4164-RAMs durch 41256-Typen ersetzt. Die beiden zusätzlich nötigen Adressen kann ein I/O-adressiertes Latch liefern (Abb. 1). Damit kann man zwischen vier Blocks mit je 64 kB um- schalten. Abb. 1, 2 und 3Dabei würden dann aber der Stack, Interrupt-Serviceroutinen und alles an Software abgekniffen werden, was für eine einwandfreie Funktion nötig ist. Der Z80 würde sich in der neuen Bank, wo noch kein Programm enthalten ist, verlaufen. Deshalb muß ein Teilbereich des Speichers auch beim Umschalten der Bank erhalten bleiben, wo der Z80 alles Lebenswichtige vorfindet. Im Genie III s ist das mit vier Banks in Form von vier Reihen 4164-RAMs so gelöst, daß mit dem Zustand von Bit 0 des Ports F9h festgelegt wird, ob der Adreßbereich 0000h-3FFFh oder der Bereich E000h-FFFFh nicht mit umgeschaltet wird (Common-Bereich): Port F9h, Bit 0: Die Auswahl unter den vier Banks geschieht mit den Bits 6 und 7 desselben Ports: Port F9h, Bits 6, 7:00: Bank 0 01: Bank 1 10: Bank 2 11: Bank 3 Unabhängig von der eingeschalteten Bank wird bei Zugriff auf den als Common definierten Bereich immer auf den RAM-Block 0 zurückgeschaltet. Das wird durch entsprechende Steuerung der CAS*-Freigabesignale für die vier RAM-Reihen erreicht (Abb. 4). Abb, 4: CAS*-Freigabesignale der 4 64-kb-BlocksZur Vorgabe der Adressen A16 und A17 für 41256-RAMs anstelle der ursprünglichen 4164-RAMs wurde ein unter der Portadresse F3h decodiertes Latch 74LS273 (Abb, 1) herangezogen, dessen Ausgänge Q0 und Q1 diese Adressen liefern. Damit läßt sich innerhalb eines 256-kB-Blocks (8 Stück 41256-RAMs) vorgeben, welches Viertel der RAM-Bausteine ansprechbar sein soll. Die RAM-Reihe selbst wird weiterhin über Port F9h, Bits 6 und 7 selektiert. Das Zusammenspiel beider Ports bei der Adressierung jeweils eines Blocks zu 64 kB veranschaulicht die Abb. 6. Abb. 5: Die Speicherkonfiguration des Genie III sa) im Originalzustand
Das Umschalten auf die RAM-Reihe 0 beim Zugriff auf den als Common definierten Adreßbereich (Port F9h, Bit 0) leistet eine entsprechende Schaltung im GIIIs. Die Common-Bedingung wird auf Wunsch (s. u.) auch bei der Umschaltung innerhalb der Viertel der 41256-Chips beachtet: Die Selektion des unteren Viertels einer Reihe 41256-RAMs wird Uber die Steuerung des Pins 1 (Select) des 74LS157-Multiplexers in der abgebildeten Schaltung erreicht. Das wäre prinzipiell durch die AND-Verknüpfung der beiden low aktiven Signale COML* und COMH* (U84, 74LS00, Pins 12 und 13) möglich. Wenn eines dieser Signale low ist, wird Uber low am SEL-Eingang des Multiplexers GND auf die Ausgänge durchgeschaltet und nicht die Bits Q0 und Q1 des Latch. COML* und COMH* werden low, also aktiv, wenn der unten bzw. oben im 64-kB-Adreßraum als Common definierte Speicherbereich angesprochen wird. Hier wurde aber zusätzlich die Möglichkeit geschaffen, über Q7 des Latch (Port F3h, Bit 7) die Steuerung des SEL-Eingangs des Multiplexers zu unterbinden. Wenn D7 des Ports F3h high ausgegeben ist (Bit im Output gesetzt), wird die automatische Umschaltung auf das untere Viertel einer 256K-RAM-Reihe unterbunden. Dann ist nur noch die ursprüngliche Steuerung der CAS*-Freigabesignale vom Zugriff auf den festgelegten Common-Bereich belangt (Selektion einer RAM-Reihe, aber nicht des unteren Viertels). Das Verhalten des Computers läßt sich mit Q7=1 aus dem Normalverhalten (nur 1 aktiver Common-Bereich, 16 Banks) in einen zweiten Zustand umschalten: Es gibt dann 6 Blocks zu je 256 kB (Port F3h, Bits 0 und 1) mit je einem eigenen Common-Bereich an der durch Port F9h, Bit 0 definierten Adresse. Jeder dieser Blocks kann unabhängig hiervon je nach Port F9, Bits 6 und 7 eine der vier RAM-Reihen benutzen. Das entspricht der parallelen Existenz von vier Computern mit je vier Banks zu 64 kB. In anderen Worten: Wahlweise stellt die hier vorgestellte Schaltung einem Computer 1 MB RAM zur Verfügung, oder vier voneinander unabhängige Computer verwalten je 256 kB RAM. Die zweite Variante entspricht dem Originalzustand des GIIIs - mal vier. Das Nebeneinander der nunmehr 16 Blocks zu je 64 kB ist in Abb. 5 b und c dargestellt. Da das verwendete Latch 74LS273 aber 8 Bits verfügbar hat, sollte damit weiteres Tune-Up verwirklicht werden. Der Bildwiederholspeicher und der Zeichengenerator sind 6116LP15-RAMs. Diese Einheiten können unter Verwendung von 6264LP15-Speichern ebenfalls vervierfacht werden, wenn deren zusätzliche Adreßleitungen A11 und A12 mit den Ausgängen 02 und 03 des Latch beschaltet werden. Über D2 und D3 am Port F3h läßt sich einer von vier Bildwiederholspeichern mit eigenem Zeichengenerator-RAM selektieren. Und schließlich sollte auch noch der HRG-Speicher von 64 auf 256 kB durch Austausch der 4164-RAMs gegen 41256-Typen auf acht Pages aufgebohrt werden. Die Selektion eines Viertels des neuen Speichers sollte über D4 und D5 am Port F3h erfolgen. Innerhalb des adressierten Viertels könnte dann weiterhin wie bisher eine von zwei Pages zu 32 kB gewählt werden. Die alte Software würde dadurch in ihrer Funktionsfähigkeit nicht beeinträchtigt werden. Aus nicht verständlichen Gründen funktionierte das Umschalten bei einem Versuch nicht, Q4 und Q5 als Adressen A16 und A17 über einen Multiplexer 74LS157 (auch 74HC157) auf die neuen 41256-RAMs des HRG-Speichers zu legen. Sein Pin 1 wurde durch das gleiche Signal gesteuert wie die beiden schon existierenden Multiplexer. Evtl, kann die Verwendung eines S- anstatt des LS- bzw. HC-Typs das Problem lösen. Vielleicht kann uns jemand mit einem Tip weiterhelfen? Auch eine andere Funktion, die nach Schaltplan einwandfrei arbeiten sollte, versagte den Dienst. Durch NAND-Verknüpfung von Q6 des Latch und MWR* sollte erreicht werden, daß bei high gesetztem Bit 6 im Port F3h beim Lesen des Speichers auf Computer 0 geschaltet wird, und nur beim Schreiben der RAM-Speicher des mit DO und D1 festgelegten Computers angesprochen wird. Damit wäre es besonders einfach geworden, den Speicherinhalt von Computer Nr. 0 auf seine drei Nachbarn zu übertragen, um sie mit Initial-Information zu laden. Das hätte der Fähigkeit des EG 64 MBA entsprochen, mit einem einfachen LDIR den ROM-Inhalt auf das parallele RAM zu kopieren. Auch dieses Feature funktioniert wider Erwarten nicht. Im Layout wurden trotzdem die Schaltungen dieser nicht funktionie- renden Elemente beibehalten. Evtl, gelingt es noch, diese Features später zum Laufen zu kriegen. Ansonsten steht einer anderweitigen Verwendung der Latch-Ausgänge Q4, Q5 und Q6 nichts im Wege. Die im folgenden beschriebene Software kommt ohne diese Funktionen aus. Die nicht funktionsfähigen Teile der Schaltung haben insb. auch keinen negativen Effekt auf sie, so daß sie im Hinblick auf späteres Gelingen durchaus bereits bestückt werden können. Die drei Gruppen zu je zwei Bits am Port F3h sind voneinander unabhängig ansprechbar. So kann z.B. über D2 und D3 zwischen mehreren Bildschirmen und Zeichensätzen gewählt werden, D4 und D5 können im Graphikspeicher einen Spooler mit luxuriöser Kapazität zur Verfügung stellen, während D0 und D1 ständig low bleiben, also gewissermaßen im Computer Nr. 0 gearbeitet wird. Und Computer Nr. 3 kann eine Graphik ändern, die Computer Nr. 1 erstellte usw.. B: Die Software zur Umschaltung zwischen vier RechnernWährend dieser Text entsteht, lauert im selben Gehäuse, aber dennoch in einem zweiten Computer ZEUS mit dem Quelltext des Programms, das nun vorgestellt werden soll. So kann während der Arbeit mal eben hinübergeschaltet werden, um vergessene Einzelheiten ins Gedächtnis zurückzurufen. Und damit ist auch schon gesagt, was das Ganze soll. Wir sozial Schwachen, die sich nur einen Rechner leisten können, brauchen auf den Komfort mehrerer Maschinen nun nicht mehr zu verzichten. Da gibt es Blocks, RAM-Reihen, Banks, Adreßräume usw.. Um die Verwirrung in Grenzen zu halten, schlagen wir folgende Sprachregelung vor: Ein Block ist eine bestimmte Datenmenge, die gleichzeitig bearbeitet wird. Eine RAM-Reihe sind acht Speicherchips 41256, die über Port F9h, Bits 6 und 7 gleichzeitig selektiert sind. Funktional gesehen ist es sinnvoll, sie als Banks zu bezeichnen. Die Speicherviertel innerhalb einer Reihe von 41256-RAMs, um die es in diesem Beitrag geht, sollen hier Computer genannt werden, denn das Programm verwirklicht das Konzept von vier Rechnern, die einander auf Knopfdruck abwechseln. Dieser Knopfdruck sollte nicht aus Versehen erfolgen können. Deshalb wird mit der Kombination von Shift-CTRL und einer Taste von 0-3 im Ziffernblock umgeschaltet. Dazwischen liegen rd. 35 cm, so daß Zufälle ausgeschlossen sind. Gleichwohl wäre ein solches Versehen nicht tragisch, denn eine Umschaltung ist sowohl mit, wie auch ohne Absicht erlaubt und ungefährlich. Alle Speicherinhalte bleiben bestehen, sogar die restliche Blinkzeit eines Cursors wird auf die Nanosekunde genau beim Zurückschalten nachgeholt. Der Tastendruck wird während der Interrupt-Bearbeitung erkannt. Hierzu wird ein CALL nach 45BEh (Erkennen der Dreitastenbefehle) an der Stelle 4601h umgeleitet (Z. 490 im Listing). Das alte Lied: Wohin mit Erweiterungen des Betriebssystems? Diesmal mußte ein Speicherbereich dran glauben, der von TCS bei der Modifikation des Microsoft-Interpreters offenbar vergessen wurde. Ab 0000h wird weder nach dem Einschalten noch bei einem Reset gelesen, denn dann ist das Boot-EPROM aktiviert. In diesem Speicher-Niemandsland wird vom Programm erkannt, ob Shift-CTRL-Ziffer gedrückt wurde. Dazu stehen aber nur 8 Bytes bis zum Beginn der RST-08h-Routine zur Verfügung. Deshalb verabschiedet sich das neue RST 00h an der Stelle 0007h kurzerhand aus der Bank 0 und macht in Bank 1 weiter, wo das Betriebssystem erst wieder bei 0100h (Zeichensatz-Puffer) Platz beansprucht. Diese Umschaltung geschieht mit dem Bit 0 von Port F9h. Da die normale Arbeitsbank Bank 1 ist, wobei Common unten in Bank 0 liegt, ist der Trick simpel: Das Common-Bit wird auf 1 gesetzt, so daß die CPU, ohne es zu merken, nun auch unten in Bank 1 liest, denn: Common, d. h. der Bereich, wo immer in Bank 0 gearbeitet wird, liegt jetzt ab E000h. Im Listing hat dieses Programmsegment das Label rst00 (Z. 664). Es liegt sowohl in Bank 0 als auch in Bank 1 bereit, so daß die Umschaltung aus beiden Banks auf die gleiche Weise geschieht. Es wird einfach D0 des Ports F9h invertiert. Beim Umschalten aus Bank 0 (Common unten) wird die scheinbar nahtlose Fortsetzung in Bank 1 gefunden (Label bank1). Beim Zurückschalten aber muß rechtzeitig vor dem Erreichen der anschließenden RST-08h-Routine zur Fortsetzung der INT-Serviceroutine gesprungen werden. Deswegen wurde zuvor in Bank 1 HL mit 45BEh geladen, der Adresse, wo es weitergehen soll (s. o.). In Z. 495 wurde zu diesem Zweck der Befehl JP (HL) (Code E9h) in Bank 0 ans Ende dieses Segments gepatcht. Nachdem HL die Adresse der Fortsetzung enthält, wird die Tastatur in 3880h und 38C0h nach den Tasten Shift und CTRL sowie nach den Ziffern 0-3 im Dezimalblock befragt. Wenn diese Tastenkombination nicht gedrückt wurde, will der User offenbar nicht den Computer wechseln. Es erfolgt ein Rücksprung nach 0000h, wo wieder die alte Bank-Konfiguration eingestellt wird. Es ist, als wäre nichts geschehen. Wurde aber Shift-CTRL-Ziffer eingegeben, wird zunächst der Zifferncode in einen Zähler für die gewünschte Computer-Nr. umgerechnet und nach B geladen. Da sich die vier Computer außer der CPU natürlich auch alle Ports teilen müssen, werden die Zustände der beiden einzig wirklich lebenswichtigen, FAh und F9h, zwischengepuffert, jener sofort, dieser etwas später. Bei dieser Gelegenheit wird auf FAh das Bit 5 gesetzt, um einen Schreibschutz für den Adreßbereich des ehemaligen TRS-80-ROMs zu erreichen. Es könnte ja sein, daß ein Programm ihn als Sektorpuffer o. ä. benutzt. In der Folge bekommt die Umschaltroutine auch ihren eigenen Stack. Das muß sein, weil er z. B. bei BASIC im Himem liegt, wo ja jetzt die Bank 0 selektiert ist; der Stack wäre unerreichbar! Der alte Stapelzeiger wird gepuffert. Je nach dem kurz zuvor aufgesetzten Computer-Zähler wird so oft zum Ausgangswert -15h (=+EBh) 15h addiert, bis die Nr. des zuständigen Computers im Akku steht. Die Zahl 15h ergibt sich folgendermaßen: Beispielsweise bei der Selektion von RAM 1, Bildschirm und Zeichensatz Nr. 1 und Graphikspeicher Nr. 1 liegt am Port F3h der Wert xx01.0101b an (xx sind die beiden Steuerbits, die keinem eigenen Computer zugeordnet sind). Abgesehen von den Bits 6 und 7 ist das die Zahl 15h. Um einen Computer höher zu gehen, wird deshalb 15h addiert. Der so gewonnene Output für den Port F3h wird an die Adresse mit dem Label newcomp gepatcht. Jetzt müssen alle Register gerettet werden, weil die benachbarten Computer nicht jeder eine eigene CPU haben. Die INT-Routine hat die Hälfte dieser Arbeit schon erledigt, so daß nur noch die Indexregister und der alternative Registersatz gepushed zu werden brauchen. Nun kann umgeschaltet werden. Das Bit 7 wird zuvor gesetzt, damit bei Common-Einstellung nicht in die Bank 0 des Computers Nr. 0 zurückgeschaltet wird. Modifikationen, die der User oder das System dort vorgenommen hat, sollen ja nicht für alle vier Computer gelten. Nach dem Umschalten auf einen Nachbarcomputer wird alles wieder re- stauriert. Es beginnt mit dem Output auf den Port F9h, der aber zunächst noch in E zwischengelagert wird. Zur Restauration des Bildschirmformats (auch den Video-Controller gibt es nur einmal) müssen nämlich noch im oberen Common-Bereich, der ja z. Zt. noch selektiert ist, die CRTC-Parameter aus 37F0h-37FFh ausgelesen und auf den Controller ausgegeben werden. Diese Video-Codes liegen nun wiederum im unteren Common. Also hilft nur eine Umschaltung auf Bank 0, die beide Common-Bereiche gleichzeitig zugänglich macht. Daher der Umweg Uber das Unterprogramm vidpar, das die komplette Bank 0 verwalten kann. Zur Erinnerung: Der Arbeitsspeicher ist die Bank 1, daher diese Umstände, vidpar macht sich die Arbeit leicht, indem es ein fertiges Unterprogramm des Betriebssystems ab 3551h aufruft, das die Codes an den Video-Controller ausgibt. Zuletzt schaltet es wieder auf Bank 1, Common oben und kehrt zurück. Jetzt werden auch der Port FAh, die CPU-Arbeitsregister und der Stackpointer restauriert. Wohlgemerkt sind es die Registerinhalte, die der Nachbarcomputer irgendwann zuvor für sich selber auf den eigenen Stack der Umschaltroutine gelegt hat. Was soeben gerettet wurde, liegt im alten Computer sicher. Mit dem abschließenden Sprung nach 0000h (Label rst00) wird Common wieder nach unten verlegt und die INT-Routine - diesmal diejenige des neuen Computers - zuende bearbeitet. Außer der Umschaltung mit dem komplizierten Tastendruck geht es auch durch Aufruf des Programms mit seinem Namen. Um dabei nicht jedesmal die Floppy rotieren zu lassen, ist es hier eine Systemdatei, so daß sie gleich beim Booten in den Speicher geladen wird. Sie erledigt verschiedene Aufgaben: Bevor die Umschaltroutine arbeiten kann, sind etliche Initialisierungen notwendig. Hauptsächlich muß natürlich der Computer Nr. 0 auf die drei Nachbarn kopiert werden, damit die CPU nach dem Umschalten sofort sinnvollen Code lesen kann. Bei Testläufen hat es sich erwiesen, daß nur vom Computer 0 aus die Kopie stattfinden darf. Es könnte ja sein, daß der User ein wenig damit herumexperimentieren möchte oder sein digital bereits ebenso verseuchtes Kind nicht weiß, daß Mama oder Papa schon den Rechner wechselte. Deshalb wird bald nach dem Einsprung (Label test0) überprüft, ob die Bits 0 und 1 unseres neuen Systembytes 2 (zuständig für den Hauptspeicher) beide auf 0 stehen. Ist das nicht der Fall, wird einfach nur der derzeit selektierte Computer angezeigt. Diese Anzeige kann auch mit einem dem Aufruf folgenden Fragezeichen erhalten werden. Ein weiteres Argument kann dem Befehl folgen: Wenn eine Ziffer von 0-4 eingegeben wurde, wird der so angewählte Computer selektiert. Allerdings nur dann, wenn zuvor die Initialisierung stattgefunden hat. Das merkt das Programm daran, ob an der Stelle 0000h in der Bank 1 bereits der Befehl DI steht. Ist das nicht der Fall, wird mit einer Fehlermeldung das Unternehmen abgebrochen. Wenn aber alles klar ist, ergibt die eingegebene Ziffer bereits die gewünschte Computer-Nr.. Es kann daher in Bank 1 an der Stelle switch mitten in die RST-00h-Routine gesprungen werden, wobei die Ermittlung des Computers und - sehr wichtig! - die Tastaturabfrage übersprungen werden. Zusätzlich gibt es folgende Argumente: Wie in G-DOS üblich, kann das Ein- und Ausschalten des Features der vier Computer mit J (für "ja") und N (für "nein") erfolgen. J wird auch angenommen, wenn kein Argument folgt. N kann in jedem der vier Computer eingegeben werden. Dann bleibt immer dasselbe Viertel der 41256-RAMs selektiert, um in diesem Computer beispielsweise eine unverfälschte INT-Routine zu Testzwecken zu haben. Dennoch kann mit SYS,BK,n (n = Nr. des Computers) umgeschaltet werden; nur die Tastenkombination Shift-CTRL-n ist deaktiviert. Und dies gilt auch nur für den gerade selektierten Computer. Mit R (für "recover") werden die vier Computer reaktiviert, wenn ein zwischenzeitliches Reset oder ein SYS,BK,N es abschaltete. Auch hier muß zuvor bereits die Ini tialisierung erfolgt sein, sonst wird ein Fehler gemeldet. Falls die Initialisierung der Nachbarcomputer gewünscht wird und erlaubt ist, wird’s jetzt hektisch: Im Verlauf der nächsten Mikrosekunden werden der Stackpointer, das Systembyte 0 (Port F9h) und das Systembyte 1 (Port FAh) als Initialwerte in die RST-00h-Routine gepatcht. Deren kürzerer Teil, der in Bank 0 liegen soll, wird nach 0000h verschoben. Das bereits erwähnte Byte E9h für JP (HL) kommt dahinter. Durch verschiedene Manipulationen der beiden Systembytes 0 und 1 werden Bildschirme aus- und wieder angeknipst, expandiert und wieder komprimiert, Tastaturen abgewürgt, Zeichensätze freigegeben, Common-Bereiche umdefiniert und dergleichen mehr. Es würde zu weit führen, das hier im einzelnen zu erläutern. Die Kommentare im Listing protokollieren es jeweils. Eine Hilfe zum Verständnis kann auch die Tabelle am Ende dieses Abschnitts geben. Die Kopie des Hauptspeichers kann nicht auf einen Schlag geschehen. Das liegt daran, daß jeweils ein Common-Bereich erforderlich ist, der immer in der Bank 0 arbeitet. Das Feature, das mit Q6 des Latches ermöglicht werden sollte, funktionierte ja leider nicht. Soll also beispielsweise im Common-Adreßraum gerade die Bank 2 kopiert werden, ist sie einfach nicht da. Daher wird das Unterprogramm COPY, das später erklärt werden soll, sowohl in das obere als auch in das untere Common kopiert. Die beiden Routinen bearbeiten dann jeweils nur eine Speicherhälfte von viermal 32 kB. Mit dem oben residierenden Kopierprogramm wird gleich VIDPAR mitverschoben. Zuerst wird der Bildschirm vervierfacht. Dazu muß er zunächst in einen Puffer im unteren Adreßraum der Bank 1 kopiert werden. Er findet Platz hinter dem Zeichensatzpuffer ab 1100h. Beim Schreiben des gewählten Zeichensatzes in die drei benachbarten Zeichengeneratoren steht das Adreß-LSB des gerade bearbeiteten Zeichens im Bildschirm an der Stelle 3C00h. Um den dadurch veränderten Bildschirm nicht umständlich restaurieren zu müssen, erfolgt zuerst die Kopie des Zeichensatzes, erst anschließend wird der Bildschirminhalt aus dem Puffer in den Bildwiederholspeicher geladen. Das Zeichen von 3C00h wurde im Puffer ja nicht verändert. Die Auswahl des gerade aktuellen Bildschirms bzw. Zeichensatzes geschieht Über die Bits 2 und 3 des Ports F3h. Um die beiden Kopierroutinen aufrufen zu können, ist ab Z. 576 wieder einiges Banking erforderlich. Auch hier mag der Verweis auf die Kommentare und die Tabelle ausreichen. Die Routinen selbst arbeiten folgendermaßen: Am Label copy wird ein Zähler mit 32 aufgesetzt. Die Datenmenge, für die der erforderliche Puffer ausreicht, beträgt 1 kB. 32 kB pro Bank übernimmt eins der beiden Kopierprogramme. Gleich anschließend wird dieser Zähler gerettet und derjenige für die Banks geladen. Jetzt wird aus jeder Bank des Computers Nr. 0 ein Block zu 1 kB in den Puffer geholt. Schließlich wird in der inneren Schleife, welche die drei Nachbarcomputer abzählt, der Pufferinhalt auf die Nachbarn kopiert. Um die Adresse des zu bearbeitenden 1-kB-Blocks zu aktualisieren, genügt es, ihr MSB um 4 zu erhöhen (ab Z. 654), denn 0400h = 1 kB. Um die Adressen beim Blocktransferbefehl LDIR nicht zu zerstören, müssen sie fortlaufend gerettet und wieder restauriert werden. Neben den LDIR-Befehlen selbst sind es diese PUSHes und POPs, die beim Kopieren die meiste Zeit verbrauchen. Insgesamt läuft das Programm deshalb etwa dreieinhalb Sekunden, bei immerhin einem Megabyte eine erträgliche Zeit. Um möglichst schnelle 8-Bit-Befehle anwenden zu können, werden nur die MSBs geladen. Die LSBs betragen immer 00h, so daß sie nicht berücksichtigt werden müssen. Diese - im Computer-Maßstab - extrem langwierige Prozedur läuft jedoch nur nach dem Aufruf des Programms ab. Nach der Initialisierung geschieht das Umschalten zwischen den Computern hundertmal schneller als ein Blinzeln. Nach den Kopiervorgängen bleibt nur noch übrig, die Systembytes 0 und 1 sowie den Stackpointer zu restaurieren. Mit RET wird ins DOS zurückgekehrt. Wie gesagt, müssen sich die vier Computer die gesamte Hardware teilen, lediglich die Speicherbausteine haben sie für sich. Der User muß deshalb wissen, daß gewisse Einschränkungen in Kauf zu nehmen sind. So ist es beispielsweise nicht möglich, mit der seriellen Schnittstelle auf Computer Nr. 0 eine Mailbox anzurufen und zwischendurch damit einen seriellen Drucker zu bedienen. Die Schnittstelle wird beim Umschalten nicht berücksichtigt. Dasselbe gilt für die Floppies, die PIO und evtl, angeschlossene Peripherie auf dem Systembus. Dennoch können alle Bauteile von allen Computern benutzt werden. Es darf eben nur nicht umgeschaltet werden, wenn sich z. B. gerade die Floppy dreht. In der hier vorgestellten Form ist das Programm Teil der Systemdatei SYS25/SYS. Dies erschien sinnvoll, weil es ganz entschieden ins Betriebssystem gehört und notfalls auch unter Mini-DOS mitten in einem Programmablauf abrufbar sein sollte. Da die Library des Genie III s schon voll ist, wird es mit dem SYS-Befehl (hier SYS,BK für "BANK") aktiviert, der an dieser Stelle bereits vorgestellt wurde. So erklärt sich das Vorgeplänkel am Beginn des Listings, wo zum alten Inhalt von SYS25/SYS (Bedienung der F-Tasten) der Test auf den neuen Requestcode DBh für SYS,BK eingefügt wurde. Was zwischen den Zeilen 27 und 405 steht, ist mit LIST OFF ausgespart, denn die F-Tasten sind hier nicht unser Thema. Dies gilt auch für die Label-Definitionen bis Z. 22. Es gibt keine Einschränkungen des Speicherplatzes. Nach dem Laden steht SYS25/SYS zunächst im DOS-Overlay-Bereich ab 4D00h, der für diese Zwecke vorgesehen und reserviert ist. Die Bereiche, die die RST-00h-Routine und das Unterprogramm vidpar belegen, sind völlig frei und werden weder vom Betriebssystem noch von den Autoren bekannten Anwenderprogrammen beansprucht. Für das RAM-Floppy-Programm MEMDISK/CMD gilt sogar, daß es vor dem Aufruf bereits aktiviert sein darf. Es wird nicht Uberschrieben, auch nicht die Dateien, die in der RAM-Floppy stehen. Alles wird einfach in die Nachbarcomputer hinüberkopiert und kann auch von dort aus benutzt werden. Wie sich herausstellte, kann aber leider nicht unter BASIC CMD'SYS,BK<,J>' eingegeben werden, um BASIC/CMD solo oder gar mit bereits geladenem Programm in die drei Nachbarcomputer hinüberzukopieren. Vielleicht gelingt es in der Folge, das ebenfalls noch zu ermöglichen. Einstweilen muß es unter DOS geschehen, wonach dann in jedem der vier Computer BASIC/CMD gesondert gestartet werden muß. Auf jeden Fall aber kann nach erfolgter Initialisierung mitten im Lauf eines BASIC-Programms auf einen Nachbarcomputer umgeschaltet werden. Mit anderen Programmen sind bisher diese Schwierigkeiten nicht aufgetreten. Im Zweifelsfall hilft immer die Methode, die eben für BASIC beschrieben wurde. Eine weitere Besonderheit muß beim Betrieb mit BASIC beachtet werden. In der RST-00h-Routine kehrt der Akku mit einem Wert >0 zurück (Output für den Port F9h). Das Z-Flag ist rückgesetzt, d. h. die NZ-Bedingung ist gegeben. BASIC versteht das als DOS-Fehler, gibt eine entsprechende Meldung aus und sagt ‘READY’. Deshalb kann man zwar ohne weiteres den Befehl CMD"SYS,BK,n' (n ist die Computer-Nr.) über die Tastatur eingeben, wenn es aber innerhalb eines Programms geschieht, wird dieses wegen des angeblich auf getretenen Fehlers abgebrochen. Das wäre mit geringen Modifikationen zu beheben gewesen, die aber Speicherplatz im kostbareren oberen Adreßraum gekostet hätten. So wurde darauf verzichtet, denn eine Umschaltung, die ein BASIC-Programm selbsttätig steuert, ist praxisfern. Das Verändern von SYS-Files und das Implementieren eines neuen Library-Befehls (auch in der Zweit-Lib mit SYS) wurde hier schon mehrfach gezeigt. Es soll nicht erneut erklärt werden. Wer sich scheut, auf diese Weise ins Betriebssystem einzugreifen, kann das Programm in der Zeile 421 mit ORG 5200h beginnen und ein CMD-File daraus machen. Dann muß das END-Statement die Startadresse sidekck haben. Ansonsten ändert sich dabei nichts. Zuletzt sollen noch diejenigen Datenbits der hier erwähnten Ports erläutert werden, die für das Programm von Belang sind: Bit 7 6 5 4 3 2 1 0 ----------------------------------------------------------------------- F3h Common =HRG-Nummer= =Bildsch. += =Haupt-Sp. Nr= Defin. Zeichens NR= ----------------------------------------------------------------------- F9h =Orig. Banks= Zeichen- Common Satz Defin ----------------------------------------------------------------------- FAh Schreib- Video ab mm-I/O schutz 3800h an/aus ----------------------------------------------------------------------- Sollte es mit der Software zur Verwirklichung von 4 Computern in einem Schwierigkeiten geben, kann Arnulf Sopp weiterhelfen. 4D00 00023 ORG 4d00h 4D00 FEFB 00024 sys25 CP 0fbh ;Lib-Befehl F# ? 4D02 2822 00025 JR Z,fkey ;falls ja 4004 FEDB 00026 CP 0dbh ;Lib-Befehls SYS,BK ? 4D06 CA2A50 00027 JP Z,sidekck ;falls ja 00405 00406 00407 ;*************************************************** 00408 ; 00009 ; Sidekick für das Genie IIIs 00010 ; 4 Computer in einem Gehäuse 00411 ; 00412 ; Hardware: 1 MB RAM, 8 kB Bildschirm, 00413 ; 16 kB Zeichensatz, 256 kB Graphik 00414 ; 00415 ; (C) 1986 by Arnulf Sopp 00416 ; starring: Helmut Bernhardt 00417 ; 00418 ;*************************************************** 00419 00420 ;Test, ob vier Computer bereits initialisiert sind 5015 DBF9 00421 tstinit I A,(0f9h) ;Systembyte 0 5017 57 00422 LD D,A ;retten 5018 F601 00423 OR 01h ;unten Bank 1 selektieren 501A F3 00424 DI ;vorsichtshalber 501B D3F9 00425 OUT (0f9h),A 501D 3A0000 00426 LD A,(0000h) ;Anf. der RST-00-Routine 5020 FEF3 00427 CP 0f3h ;steht dort bereits DI ? 5022 7A 00428 LD A,D ;Systembyte 0 5023 D3F9 00429 OUT (0f9h),A ;restaurieren 5025 C8 00430 RET Z ;o. k., falls schon DI 5026 E1 00431 POP HL ;RET-Adresse vom Stack 5027 C3224D 00432 jperr JP error ;raus mit Fehlerbeding. 00433 00434 ;Tests, ob Befehl mit Argument eingegeben wurde 502A DBF3 00435 sidekck IN A,(0f3h) ;Systembyte 2 502C E603 00436 AND 03h ;nur Hauptspeicher-Bits 502E 4F 00437 LD C,A ;retten 502F CDD54C 00438 CALL 4cd5h ;folgt etwas dem Befehl? 5032 2841 00439 JR Z,test0 ;falls nein 5034 7E 00440 LD A,(HL) ;was folgt? 5035 FE52 00441 CP ’R’ ;Recover 4 Computer? 5037 200A 00442 JR NZ,norecov ;falls nein 5039 CD1550 00443 CALL tstinit ;schon initialisiert? 503C 3EC9 00444 LD A,0c9h ;RET-Befehl 503E 329150 00445 LD (retrecv),A ;dort patchen 5041 1838 00446 JR init ;dort weiter 5043 FE4A 00447 norecov CP ’J’ ;'ja' für initialisieren? 5045 282E 00448 JR Z,test0 ;falls ja 5047 FE4E 00449 CP ’N’ ;’nein' für abschalten? 5049 2007 00450 JR NZ,notoff ;falls nicht 504B 21BE45 00451 LD HL,45beh ;alte Adr. in INT-Routine 504E 220146 00452 LD (4601h),HL ;dort restaurieren 5051 C9 00453 RET ;dann Ende 5052 FE3F 00454 notoff CP ’?’ ;Status-Abfrage? 5054 2819 00455 JR Z,dspcmp1 ;falls ja 5056 FE30 00456 CP ’O’ ;Computer-Nr.eingegeben? 5058 38CD 00457 JR C,jperr ;falls falsche Eingabe 505A FE34 00458 CP ’4’ ;nur Comp. Nr. 0-3 505C 30C9 00459 JR NC,jperr ;falls falsche Eingabe 00460 00461 ;neuen Computer selektieren, falls schon initialisiert 505E E603 00462 AND 03h ;ASCII -> binär 0-3 5060 3C 00463 INC A ;für Zähler B: 1-4 5061 47 00464 LD B,A ;Computerzähler aufsetzen 5062 CD1550 00465 CALL tstinit ;schon initialisiert? 5065 E1 00466 POP HL ;RET-Adresse 5066 DBF9 00467 IN A,(0f9h) ;Systembyte 0 5068 F601 00468 OR 01h ;Common oben, Bk. 1 unten 506A D3F9 00469 OUT (0f9h),A ;Systembyte neu ausgeben 506C C31E00 00470 JP switch-rst00 ;dort Computer umschalten 00471 00472 ;aktuelle Computer-Nr. anzeigen 506F 79 00473 dspcmp1 LD A,C ;Computer-Nr. 5070 F630 00474 dspcmp2 OR 30h ;binär -> ASCII 5072 C33300 00475 JP 0033h ;anzeigen und raus 00476 00477 ;falls Comp. Nr. 0, dann initialisieren, sonst anzeigen 5075 79 00478 test0 LD A,C ;Computer-Nr. 5076 B7 00479 OR A ;Nr. 0 selektiert? 5077 20F7 00480 JR NZ,dspcmp2 ;nur anzeigen, falls nein 5079 D3F3 00481 OUT (0f3h),A ;auch Video Nr. 0 usw. 00482 00483 ;INT-Patch in SYS0, RST-00-Routine für Bank 0 verschieben 507B ED73D75100484 init LD (spbuf1),SP ;Initialstack 507F 216B51 00485 LD HL,rst00 ;RST-00h-Routine 5082 010700 00486 LD BC,bank1-rst00 ;Länge der Rout, in Bk. 0 5085 50 00487 LD D,B ;DE <- Zieladresse 0000 5086 58 00488 LD E,B 5087 F3 00489 DI ;DISABLE INTERUPT 5088 ED53014600490 LD (4601h),DE ;CALL 0000 statt 45BE 508C EDB0 00491 LDIR ;RST-00-Routine -> Bank 0 00492 00493 ;Befehl zum Weitersprung schließt RST-00-R. in Bank 0 ab 508E 3EE9 00494 LD A,0e9h ;Befehl JP (HL) 5090 12 00495 LD (DE),A ;dahinter patchen (0007h) 00496 00497 ;Rout. zur Kopie der ob. Speicherhälfte nach 3800 laden 5091 DBFA 00498 retrecv IN A,(0fah) ;Systembyte 1 5093 F5 00499 PUSH AF ;retten 5094 32C851 00500 LD (fabuf),A ;Patch in RST 00, Bank 1 5097 F611 00501 OR 11h ;Großbildsch. , mm-I/O aus 5099 D3FA 00502 OUT (0fah),A ;Systembyte 1 neu ausgeb. 509B 08 00503 EX AF,AF’ ;nochmals retten 509C 213751 00504 LD HL,copy ;Kopierprg. f. ob. Hälfte 509F 110038 00505 LD DE,combot ;im unt. Common-Bereich 50A2 0E34 00506 LD C,rst00-copy ;Länge der Routine 50A4 EDB0 00507 LDIR ;nach 3800 übertragen 00508 00509 ;Routine zur Restauration der Bildschirmparameter und 00510 ;zur Kopie der unteren Speicherhälfte nach F600 laden 50A6 DBF9 00511 IN A,(0f9h) ;Systembyte 0 50A8 F5 00512 PUSH AF ;retten 50A9 F601 00513 OR 01h ;Common oben, Bank 1 unt. 50AB F5 00514 PUSH AF ;nochmals retten 50AC 32BD51 00515 LD (f9buf),A ;Patch in RST 00, Bank 1 50AF D3F9 00516 OUT (0f9h),A ;geänd. Systemb. ausgeben 50B1 212E51 00517 LD HL,vidpar ;CRTC-Restaur., Kopierr. 50B4 1100F6 00518 LD DE,comtop ;im oberen Common-Bereich 50B7 0E3D 00519 LD C,rst00-vidpar ;Länge der Routine 50B9 EDB0 00520 LDIR ;nach F600 kopieren 00521 00522 ;RST-00-Routine für Bank 1 in diese Bank nach 0000 laden 50BB 50 00523 LD D,B ; DE <- 0000h, wie oben 50BC 58 00524 LD E,B ;(Zieladr. RST-00-Rout.) 50BD 0E70 00525 LD C,endrst00-rst00 ;Länge RST-00-R. 50BF EDB0 00526 LDIR ;RST-00-Routine -> Bank 1 00527 00528 ;memory-mapped I/O einschalten, Zeichen-RAM freigeben 50C1 F602 00529 OR 02h ;Zeichensatz freigeben 50C3 D3F9 00530 OUT (0f9h),A 50C5 08 00531 EX AF,AF’ ;geändertes Systembyte 1 50C6 F5 00532 PUSH AF ;wird noch gebraucht 50C7 E6FE 00533 AND 0feh ;mm-I/O einblenden 50C9 D3FA 00534 OUT (0fah),A ;Systembyte 1 neu ausgeb. 00535 00536 ;Großbildschirm ab 3800 in Bank 1 ab 1100 zwischenspeich. 50CB 210038 00537 LD HL,3800h ;Anfang Bildschirm 50CE 110011 00538 LD DE,1100h ;Anfang Puffer 50D1 0608 00539 LD B,08h ;BC <- Länge 2 kB 50D3 EDB0 00540 LDIR ;Bildschirm puffern 00541 00542 ;Zeichensatz in 3 neue Zeichengeneratoren kopieren 00543 ;(3 obere Viertel der beiden 6264) 50D5 0603 00544 LD B,03h ;3 Bildsch. u. Zeichens. 50D7 C5 00545 vidloop PUSH BC ;Bildschirmzähler retten 50D8 78 00546 LD A,B ;Bildschirm-Nr. 50D9 07 00547 RLCA ;Bit 0-1 -> 2-3 50DA 07 00548 RLCA 50DB D3F3 00549 OUT (0f3h),A ;Bildschirmseite selekt. 50DD 2601 00550 LD H,01h ;HL <- Beginn Zeichensatz 50DF AF 00551 XOR A ;ab ASCII 00 50E0 32003C 00552 chrlop1 LD (3c00h),A ;LSB Zeichenadresse 50E3 08 00553 EX AF,AF’ ;retten 50E4 1684 00554 LD D,84h ;MSB in D 50E6 0610 00555 LD B,10h ;16 Bytes pro Zeichen 50E8 7E 00556 chrlop2 LD A,(HL) ;1 Byte aus dem Puffer 50E9 12 00557 LD (DE),A ;ins Zeichensatz-RAM 50EA 23 00558 INC HL ;auf nächstes Byte 50EB 7A 00559 LD A,D ;Adreß-MSB 50EC C608 00560 ADD A,08 ;um 2 kB erhöhen 50EE 57 00561 LD D,A ;neues MSB 50EF 10F7 00562 DJNZ chrlop2 ;bis 1 Zeichen eingelesen 50F1 08 00563 EX AF,AF’ ;LSB Zeichenadresse 50F2 3C 00564 INC A ;nächster ASCII-Wert 50F3 20EB 00565 JR NZ,chrlop1 ;bis 256 Zeichen eingel. 00566 00567 ;Bildschirm aus dem Puffer in 3 neue Video-Speicher kop. 00568 ;(3 obere Viertel des einzelnen 6264) 50F5 1638 00569 LD D,38h ;Bildschirmadresse 50F7 0608 00570 LD B,08h ;BC <- Bildschirmlänge 50F9 EDB0 00571 LDIR ;Bi1dschirmseite füllen 50FB C1 00572 POP BC ;Bildschirmzähler 50FC 10D9 00573 DJNZ vidloop ;bis 4 Bildschirme fertig 00574 00575 ;Vorber. d. Hauptspeicherkopien, Aufruf d. Kopierroutinen 50FE F1 00576 POP AF ;Systembyte 1 50FF D3FA 00577 OUT (0fah),A ;mm-I/0 ausblenden 5101 F1 00578 POP AF ;Systembyte 0 5102 D3F9 00579 OUT (0f9h),A ;Common oben, Bank 1 unt. 5104 60 00580 LD H,B ;untere Speicherhälfte 5105 16F7 00581 LD D,comtop+256/256 ;DE <- Pufferadr. 5107 ED73255100582 LD (spbuf2),SP ;Stackpointer retten 510B 3100F7 00583 LD SP,comtop+256 ;eig. Stack im ob. Common 510E CD09F6 00584 CALL copy+offset1 ;unteren Speicher kopier. 5111 212D40 00585 LD HL,402dh ;DOS-Ready als RET-Adr. 5114 E5 00586 PUSH HL ;auf den Initial-Stack 5115 E6FE 00587 AND 0feh ;Common unten 5117 D3F9 00588 OUT (0f9h),A ;Systembyte 0 neu ausgeb. 5119 210080 00589 LD HL,8000h ;obere Speicherhälfte 511C 1630 00590 LD D,30h ;DE <- Pufferadresse 511E 310039 00591 LD SP,combot+256 ;Stack im unteren Common 5121 CD0038 00592 CALL copy-offset2 ;oberen Speicher kopieren 5124 310000 00593 LD SP,0000h ;Stackptr. restaurieren 5125 00594 spbuf2 EQU $-2 ;(variabel) 5127 F1 00595 POP AF ;altes Systembyte 0 5128 D3F9 00596 OUT (0f9h),A ;restaurieren 512A F1 00597 POP AF ;dto. Systembyte 1 512B D3FA 00598 OUT (0fah),A 512D C9 00599 RET ;zurück i. Betriebssystem 00600 00601 ;Bildschirm-Parameter restaurieren (Arbeitsadresse F600) F600 00602 comtop EQU 0f600h ;im oberen Common-Bereich A4D2 00603 offset1 EQU comtop-$ ;für Kopie d. unt. Hälfte 512E D3F9 00604 vidpar OUT (0f9h),A ;Bank 0 selektieren 5130 CD5135 00605 CALL 3551h ;Videoparameter setzen 5133 7B 00606 LD A,E ;Systembyte 0 5134 D3F9 00607 OUT (0f9h),A ;restaurieren 5136 C9 00608 RET 00609 00610 ;Speicher von Computer Nr. 0 auf Nachbarcomputer kopieren 00611 ;(Arb.-adr. 3800 f. ob. Hälfte o. hinter vidpar f. unten) 3800 00612 combot EQU 3800h ;im unteren Common-Ber. 1937 00613 offset2 EQU $-combot ;für Kopie der ob. Hälfte 00614 00615 ;32 Blocks zu je 1 kB in 3 Computer mit je 4 Banks kop. 5137 0620 00616 copy LD B,32 ;32 Blocks zu 1 kB kop. 5139 C5 00617 coplop1 PUSH BC ;Blockzähler retten 00618 00619 ;1 Block zu je 1 kB vor Kopie im Puffer Zwischenspeichern 513A 0604 00620 LD B,4 ;4 Banks 513C C5 00621 coplop2 PUSH BC ;Bankzähler retten 513D E5 00622 PUSH HL ;dto. Zeiger 513E D5 00623 PUSH DE 513F 0604 00624 LD B,04h ;0400 = 1 kB 5141 EDB0 00625 LDIR ;Block puffern 5143 E1 00626 POP HL ;Quelle und Ziel tauschen 5144 D1 00627 POP DE 00628 00629 ;1 Block zu je 1 kB in 1 Bank von 3 Computern kopieren 5145 0603 00630 LD B,3 ;Zähler 3 Nachbarcomputer 5147 C5 00631 coplop3 PUSH BC ;Computerzähler retten 5148 78 00632 LD A,B ;lfd. Computer-Nr. 5149 D3F3 00633 OUT (0f3h),A ;Computer selektieren 514B 0604 00634 LD B,04h ;1 kB 514D E5 00635 PUSH HL ;Zeiger retten 514E D5 00636 PUSH DE 514F EDB0 00637 LDIR ;1 Block in Nachbarcomp. 5151 D1 00638 POP DE ;Zeiger restaurieren 5152 E1 00639 POP HL 5153 C1 00640 POP BC ;dto. Computerzähler 5154 10F1 00641 DJNZ coplop3 ;bis 1 Bl. in 4 C., 1 Bk. 00642 00643 ;dasselbe in der nächsthöheren Bank 5156 AF 00644 XOR A ;Computer Nr. 0 selekt. 5157 D3F3 00645 OUT (0f3h),A 5159 DBF9 00646 IN A,(0f9h) ;Systembyte 0 515B C640 00647 ADD A,40h ;1 Bank höher 515D D3F9 00648 OUT (0f9h),A ;selektieren 515F EB 00649 EX DE,HL ;Zeiger rücktauschen 5160 C1 00650 POP BC ;Bankzähler 5161 10D9 00651 DJNZ coplop2 ;b. 1 Bl. in 3 C., 4 Bks. 00652 00653 ;dasselbe für den nächsten Block der Speicherhälfte 5163 24 00654 INC H ;auf nächsten Block 5164 24 00655 INC H ;(= 0400 addieren) 5165 24 00656 INC H 5166 24 00657 INC H 5167 C1 00658 POP BC ;Blockzähler 5168 10CF 00659 DJNZ coplop1 ;bis 1 Memory-Hälfte kop. 516A C9 00660 RET ;zum Aufrufer 00661 00662 ;RST-00h-Rout., Segment in Bank 0 u. 1 (Arbeitsadr. 0000) 00663 ;von Bank 0 auf Bank 1 und umgekehrt schalten 516B F3 00664 rst00 DI ;keine Störungen 516C DBF9 00665 IN A,(0f9h ;Systembyte 0 516E EE01 00666 XOR 01h ;Bank 0 <-> 1 5170 D3F9 00667 OUT (0f9h),A 00668 ;in Bank 0 an der Adresse 0007 folgt hier JP (HL) 00669 00670 ;Fortsetzung in Bank 1 ab 0007 00671 ;INT-Forts. sichern, prüfen, ob Sh.-CTRL-Ziffer gedrückt 5172 21BE45 00672 bank1 LD HL,45beh ;Forts, d. INT-Routine 5175 3A8038 00673 LD A,(3880h) ;Tastatur Steuerzeichen 5178 FE03 00674 CP 03h ;Shift-CTRL gedrückt? 517A 20EF 00675 JR NZ,rst00 ;falls nein 517C 3AC038 00676 LD A,(38c0h) ;Tastatur Ziffernblock 517F E60F 00677 AND 0fh ;0 - 3 gedrückt? 5181 28E8 00678 JR Z,rst00 ;falls nein 00679 00680 ;Tastendruck erfolgt, Zähler für Computer-Nr. aufsetzen 5183 0600 00681 LD B,00h ;Anfangsw. Computer-Nr. 5185 04 00682 getcomp INC B ;B hochzählen 5186 0F 00683 RRCA ;Tastenbit ins Cy 5187 30FC 00684 JR NC,getcomp ;falls noch nicht gefund. 00685 00686 ;Systembytes, Stack und Adresse der Programmforts, retten 00687 ;(ab hier auch Bearbeitung mit Befehl SYS,BK,n) 5189 DBFA 00688 switch IN A,(0fah) ;Systembyte 1 518B E6DF 00689 AND 0dfh ;Schreibschutz aufheben 518D D3FA 00690 OUT (0fah),A ;Systembyte neu ausgeben 518F F620 00691 OR 20h ;Schreibschutz 0000-2FFF 5191 325D00 00692 LD (fabuf-rst00) ;Systembyte 1 retten 5194 ED736C0000693 LD (spbuf1-rst00),SP ;SP retten 5198 3100F7 00694 LD SP,comtop+256 ;eigener Stack im Common 519B E5 00695 PUSH HL ;Fortsetzungsadresse 519C DBF9 00696 IN A,(0f9h) ;Systembyte 0 519E 325200 00697 LD (f9buf-rst00),A ;retten 00698 00699 ;Nachbarcomp. errechnen (RAM, Video, Zeichens., HRG-RAM) 51A1 3EEB 00700 LD A,0ebh ; -15, Anfw. Comp. & Video 51A3 C615 00701 getall ADD A,15h ;Cmp., Vid. u. Grph. ab 0 51A5 10FC 00702 DJNZ getall ;bis neuer Comp, errechn. 51A7 324A00 00703 LD (newcomp-rst00),A ;dort patchen 00704 00705 ;alle Alternativregister des bisherigen Computers retten 51AA 08 00706 EX AF,AF’ 51AB D9 00707 EXX 51AC DDE5 00708 PUSH IX 51AE FDE5 00709 PUSH IY 51B0 F5 00710 PUSH AF 51B1 E5 00711 PUSH HL 51B2 D5 00712 PUSH DE 51B3 C5 00713 PUSH BC 00714 00715 ;neuen Computer selektieren, dessen Videoparameter setzen 51B4 3E00 00716 LD A,00h ;Output für Port F3 51B5 00717 newcomp EQU $-1 ;je nach Tastendruck 5186 E63F 00718 AND 3fh ;Steuerbits ausmaskieren 51B8 F680 00719 OR 80h ;Common nur comp.-intern 51BA D3F3 00720 OUT (0f3h),A ;Nachbarcomputer selekt. 51BC 1E00 00721 LD E,00h ;Systembyte 0 (kommt In 51BD 00722 f9buf EQU $-1 ;vidpar in den Akku) 51BE 21F037 00723 LD HL,37f0h ;dort CRTC-Parameter 51C1 0610 00724 LD B,10h ;16 Codes 51C3 AF 00725 XOR A ;ab CRTC-Register 0 51C4 CD00F6 00726 CALL vidpar+offset1 ;Video-Attribute restaur. 00727 00728 ;Systembytes, Register usw. restaur. und Programm forts. 51C7 3E00 00729 LD A,00h ;Systembyte 1 51C8 00730 fabuf EQU $-1 ;je nach dem 51C9 D3FA 00731 OUT (0fah),A ;restaurieren 51CB C1 00732 POP BC ;alle Register restaur. 51CC D1 00733 POP DE 51CD E1 00734 POP HL 51CE F1 00735 POP AF 51CF FDE1 00736 POP IY 51D1 DDE1 00737 POP IX 51D3 D9 00738 EXX ;in den Alternativsatz 51D4 08 00739 EX AF,AF’ 51D5 E1 00740 POP HL ;Fortsetzungsadresse 51D6 310000 00741 LD SP,0000h ;SP restaurieren 51D7 00742 spbuf1 EQU $-2 ;(variabel) 51D9 1890 00743 JR rst00 ;umschalten und zurück 00744 endrst00 00745 4D00 00746 END sys25 ;dort Einsprung 00000 Fehler 10 REM: Testprogramm, beschränkt sich auf das Umschalten des Bildschirms. 20 REM: Die vier Bildschirme wechseln einander ab. Zuvor muß das Initiali- 30 REM: sierungsprogramm mit SYS,BK<,J> vom DOS aus aufgerufen worden sein. 40 REM: 50 A=INP(&HF3):REM Zustand des neuen Systembytes 2 60 A=AAND&HF3:REM Video-Bits ausmaskieren 70 B=B+&H04:REM Video-Bits hochschalten 80 B=BAND&H0C:REM höhere Bits nicht belangen 90 OUTSHF3,A+B:REM auf nächsten Bildschirm wechseln 100 F0RI=0T0100:NEXT:REM ein bißchen warten 110 G0TO60:REM dasselbe Spielchen von vorne Dasselbe in Assembler: 5200 00001 ORG 5200h 5200 DBF3 00002 Start IN A,(0f3h) ;Systembyte 2 5202 C604 00003 loop ADD A,04h ;nächste Bildschirmseite 5204 E60F 00004 AND 0fh ;nur bis Bit 3 5206 D3F3 00005 OUT (0f3h),A ;neu ausgeben 5208 08 00006 EX AF, AF’ ;retten 5209 010080 00007 LD BC,8000h ;Zähler für Verzögerung 520C 0B 00008 delay DEC BC ;herunterzählen 520D 78 00009 LD A,B ;prüfen, ob Zähler 520E B1 00010 OR C ;schon abgelaufen 520F 20FB 00011 JR NZ,delay ;falls noch nicht 5211 08 00012 EX AF,AF’ ;Systembyte 2 5212 18EE 00013 JR loop ;und von vorne 5200 00014 END Start ;dort Einsprung 00000 Fehler C: Einbau des Erweiterungsboards und Anschluß der damit erzeugten / dafür benötigten Signale Da die meisten der für diese Schaltung benötigten Signale direkt vom Z80 geliefert werden, war es zweckmäßig, ein Board zu entwerfen, das anstelle des Z80 in dessen Sockel gesteckt wird und den Prozessor selbst aufnimmt. Damit sind dann nur noch zehn Signale über freie Verdrahtung mit dem CPU-Board zu verbinden. Diese Leitungen sind an einen zweireihigen Pfostenstecker geführt. Die Signale COML* und COMH* werden von den Pins 12 und 13 von U84, 74LS00 abgenommen und in beliebiger Anordnung an die Pins 3 und 4 des Steckers geführt. MWR* an Pin 5 des Steckers ist von Pin 8 von U52 (74LS32) zu beziehen, SYSRES* an Pin 6 des Steckers kommt von Pin 13 von U68, 74LS74. Die Adressen A16 und A17 für die dynamischen RAMs (für den Arbeitsspeicher an den Pins 1 und 2 und für den HRG-Speicher an den Pins 9 und 10 des Steckers S2) können nicht direkt an die RAMs gelegt werden. Sie müssen gemultiplext an ihre jeweiligen Pins 1 geführt werden. Dafür ist zunächst die Computerplatine auszubauen und die Pins 1 aller 32 (Arbeitsspeicher) sowie 8 RAMs (Graphik) untereinander zu verbinden. Dann werden auf U35 und U15 (beide 74S157) je ein 74S157-IC mit den Pins 1, 8, 15 und 16 huckepack aufgelötet. Dafür muß das untere IC aus der Fassung genommen werden, um es nicht versehentlich in derselben festzulöten. Selbstverständlich müssen beim Auf einander löten beide ICs die gleiche Orientierung haben (Kerbe auf der gleichen Seite). Die nicht verbundenen Pins des oberen ICs werden um ca. 45* hochgebogen, um keinen Kontakt mit dem unteren zu haben. An die Pins 13 und 14 des auf U35 angebrachten 74S157 (hier genügt auch ein 74LS157) werden zwei isolierte Litzen gelötet, die an die Pins 1 und 2 des Steckers geführt werden. Zwei Litzen, die an die Pins 13 und 14 des auf U15 gesetzten ICs gelötet sind, werden an die Pins 9 und 10 des Steckers geführt. In beiden Fällen spielt die Anordnung der beiden Leitungen keine Rolle. Die Pins 12 der beiden Huckepack-ICs werden je über einen 33-Ω-Widerstand mit dem Pin 1 eines der benachbarten 41256-RAMs verbunden. Dafür muß das jeweilige RAM-IC aus der Fassung genommen und der Draht vorsichtig mit wenig Lötzinn an das obere dicke Ende des Pins 1 gelötet werden. Es ist ebenso möglich, bei herausgenommener Mutterplatine den Widerstand um deren Rand herum auf die Lötseite zu führen. Es kann zweckmäßig sein, den in die Leitung eingefügten 33-Ω-Widerstand mit einem Stück Schrumpf schlauch davor zu bewahren, Kontakt mit irgendwelchen IC-Pins zu bekommen. Die zur Vervierfachung von Video-RAM und Zeichengenerator (BIG4, BIG5 und BIG6) benötigten 6264LP15-ICs passen nicht mehr in die Fassungen der 6116LP15-RAMs. Hier hilft folgende Vorgehensweise: Die 6116-RAMs werden aus den Fassungen genommen. Die drei Kondensatoren an den Stirnseiten der Sockel werden ausgelötet und auf dem Rücken der 6264-RAMs mit kurzen Drahtstücken zwischen die Pins 14 und 28 gelötet. Die Pins 26 und 28 jedes 6264-Bausteins werden miteinander verbunden. Das IC, das in den Sockel von BIG4 gesteckt werden soll, muß an der Stirnseite (mit Kerbe) so weit beschliffen werden, daß es neben U87 mit den überstehenden Pins 1, 2, 27 und 28 in den Sockel paßt. Die beiden anderen 6264-ICs passen ohne zusätzliche Maßnahmen mit den links überstehenden vier Pins in die Sockel. Vor den Einstecken werden aber die Pins 23 aller drei RAMs um 45* abgebogen. Die Pins 2 aller drei Speicher werden miteinander und mit dem Pin 8 des Steckers S2 des 4XG3s-Boards verbunden. Auch die hochgebogenen Pins 23 werden untereinander und mit dem Pin 7 des Steckers S2 verbunden. An die Pins 27 der RAMs werden folgende Signale gelegt (die vorher an die Pins 21 der 6116-Bausteine gelangt waren):
Sollten beim Einbau der Aus-1-mach-4-Erweiterung Fragen oder Probleme auftreten, kann sich der Bastler an Helmut Bernhardt wenden. Ungebohrte Leerplatinen bietet er zum Selbstkostenpreis an. Abb. 8: (oben links) Bestückungsplan der Platine (leicht vergrößert) S1: 2 einreihige Steckerleisten für den 280-Sockel auf der Mutterplatine, je 20 Pins S2: 1 zweireihiger geknickter Pfostenstecker, 12 Pins Abb. 9: (oben rechts) Platine des Bankers, Bestückungsseite mit Drahtbrücken (leicht vergrößert) Abb. 10: (rechts) Platine des Bankers, Lötseite Abb. 11: (unten) Die Mutterplatine des GIIIs D: Eine nützliche Anwendung für das Bit Q6 In Abschnitt A dieses Artikels müssen wir leider zugeben, daß die vereinfachte und beschleunigte Kopie des Computers Nr. 0 auf seine drei Nachbarn mit Hilfe eines gesetzten Bit 6 im Port F3h leider nicht funktionierte. Auf dieses Feature kann auch verzichtet werden. Es würde die Kopierzeit von ohnehin nur dreieinhalb Sekunden um vielleicht eine halbe Sekunde verringern können. Da man nur einmal, höchstens zweimal am Tag diese Initialisierung vornimmt, ist die Wartezeit nicht so wichtig. Um Q6 aber nicht zu verschenken, haben wir es bis zum Aufspüren des Fehlers einer anderen interessanten Verwendung zugeführt: Das Boot-EPROM des Genie III s ist ohne Treiber direkt mit der CPU verbunden. Daher ist es grundsätzlich möglich, Daten nicht nur aus dem EPROM zu lesen, sondern es auch damit zu beschreiben. Es gibt dazwischen keinen unidirektionalen Treiber, der diese Datenrichtung verbieten würde. Nun kann freilich in einem ROM nicht schreibenderweise etwas geändert werden, denn es ist eben ein Read-Only-Memory. Es ist jedoch möglich, ein statisches RAM parallel dazu zu stecken. Dazu muß lediglich das WR*-Signal der CPU auf den WE*-Pin des RAMs gelegt werden. Eine einfache Logik trifft die Auswahl zwischen dem EPROM und dem statischen RAM. Die Abb. 10 zeigt die Beschaltung der nunmehr zwei Speicherbausteine anstelle des bisherigen EPROMs, nämlich dieses selbst und ein statisches RAM des Typs 6264. Ein möglichst kurzes Flachbandkabel sitzt mit einem 28-poligen Ouetschstecker im EPROM-Sockel. An seinem anderen Ende ist eine Lochrasterplatine entweder direkt aufgelötet oder mit einer Pfostensteckerverbindung befestigt. Fast alle Signale aus dem Sockel werden auf die korrespondierenden Pins der beiden Bausteine einfach durchgeschleift. Nur das Signal ROMEN* (ROM-enable) muß auf die in der Abbildung beschriebene Weise mit Bit 6 des Ports F3h verknüpft werden, um eine Auswahl zwischen dem EPROM und dem neuen statischen RAM treffen zu können. Außerdem wird MWR* von S2 des Bankers, Pin 5 dem Pin 27 (WE*) des RAMs zugeführt. Q6 wird an Pin 5 des 74LS274 auf der Lötseite der Banker-Platine abgegriffen und auf einen freien Pin von S2 geführt, so daß sich die Verbindung mit der RAM/EPROM-Bank vereinfacht. Es ist nicht erforderlich, die weiterführende Leiterbahn zum 74LS00 zu durchtrennen und gegen GND zu legen, denn das Kopierfeature funktioniert vorerst sowieso nicht. Es kann also nichts passieren, und nach der Korrektur des Fehlers ist weniger Restaurationsarbeit erforderlich (falls man überhaupt noch restaurieren will, nachdem man die Vorzüge dieser ROM/RAM-Bank erkannt hat). Der Platz zwischen dem EPROM-Sockel und der Zusatzplatine für den Banker ist so eng, daß zwar das EPROM noch eben dazwischen paßte, der neue Ouetschstecker jedoch nicht mehr ohne weiteres. Um die Zusatzplatine dennoch fest und kontaktsicher in den Sockel der CPU stecken zu können, empfiehlt es sich, das Deckelteil des Steckers nach dem Anquetschen des Kabels wieder zu entfernen und die hochstehenden Spitzen der Kontakt- klemmen abzuschleifen. Diese werden anschließend mit Isolierband beklebt, damit sie nicht die Lötseite der Zusatzplatine berühren können. Wer den Banker nicht, wohl aber das parallele RAM neben dem EPROM einbauen möchte, kann sich diese Mühe sparen. Dann steht allerdings selbstredend nicht das Bit 6 des Ports F3h zur Verfügung. Ein Umschalter, der anstelle von Q6 wahlweise GND oder über einen Widerstand von 10 kΩ +5V an die zugehörigen Eingänge des NAND-Gatters legt, erfüllt denselben Zweck. Um beim Einschalten oder nach einem Reset auf jeden Fall das Boot-EPROM zu erreichen, bekommt es den Zustand 0 des Bits 6 zugeordnet. Wenn Q6 aber 1 lautet, ist das RAM selektiert. Der zugängliche Adreßraum dieser neu geschaffenen EPROM/RAM-Bank ist 12 kB groß (0000-2FFFh). Das Original-EPROM des Genie III s (2732) belegt davon nur 4 kB (0000-0FFFh) . Es kann einfach durch einen 2764 ersetzt werden, in dessen doppelt großem Speicherplatz interessante Features untergebracht werden können. Der 28-polige Sockel führt auch an den vier bisher nicht benutzten zusätzlichen Pins die dafür erforderlichen Signale. Das statische RAM 6264 belegt von vornherein den doppelten Adreßraum von 8 kB (0000-1FFFh). Bei 1 MB Hauptspeicher grenzt die vergleichsweise bescheidene Zugabe von 8 kB an Memory-Raffgier, aber bei dem Konzept von vier Computern existiert ohne relativ aufwendiges Banking kein gemeinsamer Speicher, der zur Übergabe von Daten geeignet wäre. Dies ist in der EPROM/RAM-Bank der Fall. Wird nämlich Bit 2 des Ports FAh low gesetzt, dann ist ursprünglich auf jeden Fall im Adreßraum 0-12 kB das EPROM ansprechbar. Mit dieser Modifikation ist es nun, je nach Q6, wahlweise das EPROM oder das RAM. So können die vier Computer dort bei Selektion des RAMs auf bequeme Weise miteinander kommunizieren. Eine andere Anwendung ist für Tüftler interessant, die das Boot-EPROM gerne nach ihrem eigenen Geschmack ändern möchten. Wenn in seinem Adreßraum auch ein RAM liegt, kann eine Versuchsversion des neuen EPROM-Inhalts dort probegefahren werden, ohne gleich ein EPROM dafür zu opfern. Hier empfiehlt es sich, das Flachkabel nach außen zu verlegen, um beim Einstecken eines neuen EPROMs nicht jedesmal den Computer zerlegen zu müssen. Nun ist es zwar nicht möglich, einfach durch Aufruf mit dem Programmnamen den EPROM-Code ins parallele RAM zu laden und dort zu starten. Das anschließend gelistete Programm besorgt das aber. Die Datei muß zuvor zwischengepuffert werden, um sie anschließend nach dem Umschalten auf die EPROM/RAM-Bank und der Selektion des RAMs dort ablegen zu können. Die Programm-Laderoutine des G-DOS (Einsprung an 4419h) verfrachtet aber Programme immer gleich an ihre Bestimmungsadresse, was in diesem Falle mit der Fehlermeldung 'Ladeversuch auf ROM-Speicherplatz' quittiert würde. Deshalb muß diese Routine (in Grossers DOS-Buch LOADP genannt) zuvor durch einen Patch geändert werden: An der Stelle 4C4Dh in SYS0 wird das MSB der Ladeadresse eines Records gelesen. In dem hier vorgestellten Programm wird dort eine Umleitung (Label devia) gezapt, die feststellt, wie dieses MSB lautet. Wenn die Adresse unterhalb 3000h liegt, muß es sich um den Code für das neue EPROM handeln, den wir zunächst puffern wollen. Deshalb wird dann in Z. 41 das Bit 7 des MSB gesetzt, so daß z. B. aus der Adresse 0500h die Adresse 8500h wird. So steht nach dem Laden das Programm ab 8000h im Speicher. Im ersten Segment der Laderoutine muß nun noch der Patch in SYS0 rückgängig gemacht werden. Schließlich sorgt noch eine Sicherung dafür, daß ein fehlerhaft geladenes Programm nicht die Testbedingungen verfälscht: Bei einem auf getretenen Fehler ist die NZ-Bedingung erfüllt. In diesem Fall erfolgt einfach unverrichteter Dinge eine Rückkehr ins DOS (Z. 18). Wenn aber alles geklappt hat, wird zunächst in der EPROM/RAM-Bank das RAM selektiert, indem das Bit 6 des neuen Systembytes 2 (Port F3h) high gesetzt wird. Danach wird Uber das Systembyte 1 die Bank zugeschaltet. Jetzt ist von 0000-1FFFh das statische RAM zugänglich. Die Zeiger für die Quelle (Puffer ab 8000h), das Ziel (RAM ab 0000h) und der Zähler für die Programmlänge (2000h) werden aufgesetzt und der Code an seinen Bestimmungsort geladen. Die DOS-Laderoutine legt die Einsprungsadresse eines Programms in 4403h ab. Von dort wird sie nach HL geladen, so daß mit JP (HL) das Programm angesprungen werden kann. Für ein Boot-EPROM wird diese Adresse immer 0000h sein, aber auf diese Weise kann auch ein beliebiges anderes Programm in der neuen Bank abgearbeitet werden. Beim Einsprung in das Boot-Programm wird geprüft, ob die F1-Taste gedrückt ist, um anstelle eines Boot im Monitor zu bleiben. Das Laden des Programms dauert je nach Größe lange genug, um nach dem Aufruf der Laderoutine rechtzeitig diese Taste zu erreichen. So können sowohl die Bootfähigkeit des neuen EPROM-Inhalts als auch der vielleicht modifizierte Monitor getestet werden. Der Loader benutzt hier für den neuen EPROM-Inhalt den Filenamen BOOTEPRH/CMD. Das ist natürlich willkürlich. Der Name kann beliebig dem eigenen Geschmack angepaßt werden. Es muß auch nicht unbedingt ein Boot-Programm sein. Diese Routine lädt, was sie erwischt, und springt sie dann an. Falls Schwierigkeiten beim Einbau oder Betrieb des Statt-ROM-RAMs auftreten (auch solo ohne den Banker), können beide Autoren weiterhelfen. Abb. 12: Schaltung für die EPROM/RAM-BankAbb. 13: Verdrahtungsplan (Lötseite) 00001 ;********************************************************* 00002 ; Routine zum Laden von Programmen, die im statischen RAM 00003 ; neben dem Boot-EPROM (0000-1FFF) laufen sollen 00004 ; 00005 ; (C) 1986 by Arnulf Sopp 00006 ;********************************************************* 00007 3000 00008 0RG 3000h 00009 00010 ;Umleitung im UP LOADP (Programm laden) in SYS0 setzen, 00011 ;Programm BOOTEPRH/CMD nach 8000 verschoben laden 3000 212C30 00012 Start LD HL,devia ;Umleitung zur Modifikat. 3003 224E4C 00013 LD (4c4eh),HL ;in LOADP patchen 3006 213530 00014 LD HL,doscall ;Zeiger auf DOS-Befehl 3009 CD1944 00015 CALL 4419h ;diesen ausführen 300C 21654C 00016 LD HL,4c65h ;alten Code in LOADP 300F 224E4C 00017 LD (4c4eh),HL ;restaurieren 3012 C0 00018 RET NZ ;Ende, falls Fehler 00019 00020 ;EPROM/RAM-Bank und dort wiederum das RAM selektieren 3013 F3 00021 DI ;es wird brenzlig 3014 DBF3 00022 IN A,(0f3h) ;Systembyte 2 3016 F640 00023 OR 40h ;RAM statt EPROM 3018 D3F3 00024 OUT (0f3h),A ;selektieren 301A 3EC0 00025 LD A,0c0h ;auf RAM/EPROM-Bank 301C D3FA 00026 OUT (0fah),A ;Bank freigeben 00027 00028 ;Prg. von 8000 nach 0000 im Boot-RAM laden und anspringen 301E 210080 00029 LD HL,8000h ;Puffer des Boot-Progr. 3021 55 00030 LD D,L ;DE <- 0000 3022 5D 00031 LD E,L ;(= Zieladresse) 3023 010020 00032 LD BC,2000h ;Programmlänge 3026 EDB0 00033 LDIR ;Programm ins Boot-RAM 3028 2A0344 00034 LD HL,(4403h) ;Puffer der Startadresse 302B E9 00035 JP (HL) ;Programm anspringen 00036 00037 ;Patch in LOADP: Code bis 3000 soll nach 8000 ff. kommen 302C CD654C 00038 devia CALL 4c65h ;MSB Ladeadresse holen 302F FE30 00039 CP 30h ;zum Boot-Progr. gehörig? 3031 D0 00040 RET NC ;norm. weiter, falls nein 3032 F680 00041 OR 80h ;ab 8000 laden 3034 C9 00042 RET ;normal weiter 00043 00044 ;DOS-Befehl zum Laden des neuen Boot-Programms 3035 4C 00045 doscall DM ’LOAD,BOOTEPRH/CMD’,0dh ;DOS-Bef., ENTER 00046 3000 00047 END start ;dort Einsprung 00000 Fehler devia 302C doscall 3035 start 3000 4D00 00023 ORG 4d00h 4D00 FEFB 00024 sys25 CP 0fbh ;Lib-Befehl F# ? 4D02 2822 00025 JR Z,fkey ;falls ja 4D04 FEDB 00026 CP 0dbh ;Lib-Befehls SYS,BK ? 4D06 CA2A50 00027 JP Z,sidekck ;falls ja 1986 Club80-Info Nr. 17, S.54 Nachtrag zu Dein GIIIs, die 4 unbekannten Wesen Helmut Bernhardt, Arnulf Sopp Wir mußten in diesem Artikel ratlos zugeben, daß die Vervierfachung des Grafik-Speichers nicht geklappt hatte! Sie klappt jetzt. Schuld war ein unbemerkter Lötzinntropfen, der den Pin 1 der RAMs (gemultiplexte Adressen A16 und A17) per Kurzschluß auch noch mit Refreshes beglückte. Die Schaltung ist also vollkommen in Ordnung und kann nachgebaut werden. Man sollte aber etwas vorsichtiger löten als wir. Es lohnt sich. Vielleicht sind 8 Grafikseiten für alberne Bilder wirklich überflüssig. Aber da es sich um gewöhnlichen RAM-Speicher handelt, ist der Zugewinn von 256KB durchaus attraktiv. Welcher "Kompatible" kann schon mit 1 1/4 MB RAM, gleichzeitig mit 4 bzw. 8 Bildschirmen und 4 Zeichensätzen aufwarten" |